é«åºŠãªWebAssemblyã»ãã¥ãªãã£ã解説ãã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã®æ€èšŒãã¡ã¿ããŒã¿æŽåæ§ã®ç¢ºèªãWasmã¢ãžã¥ãŒã«ã®æ¹ãã鲿¢ãåŠã³ãå ç¢ã§å®å šãªã¢ããªã±ãŒã·ã§ã³ãå®çŸããŸãã
WebAssemblyã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã®æ€èšŒïŒã¡ã¿ããŒã¿æŽåæ§ã®è©³çްãªåæ
WebAssembly (Wasm) ã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®ãã©ãŠã¶ããŒã¹ã®ããã©ãŒãã³ã¹åäžããŒã«ãšããŠã®åæã®åœ¹å²ãã¯ããã«è¶ ããŠé²åããŸãããã¯ã©ãŠããã€ãã£ãç°å¢ããšããžã³ã³ãã¥ãŒãã£ã³ã°ãIoTããããã¯ãã§ãŒã³ãããã³ãã©ã°ã€ã³ã¢ãŒããã¯ãã£åãã®ãæ®éçã§ç§»æ€å¯èœãã€å®å šãªã³ã³ãã€ã«ã¿ãŒã²ãããšãªã£ãŠããŸãããã®ãµã³ãããã¯ã¹åãããå®è¡ã¢ãã«ã¯åŒ·åãªã»ãã¥ãªãã£åºç€ãæäŸããŸããããããã匷åãªãã¯ãããžãŒãšåæ§ã«ã现éšã«æ³šæãå¿ èŠã§ãããã®è©³çްã®äžã€ããå·šå€§ãªæè»æ§ã®æºæ³ã§ãããæœåšçãªã»ãã¥ãªãã£äžã®ç²ç¹ã§ãããã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã§ãã
WebAssemblyã©ã³ã¿ã€ã ã¯ã¢ãžã¥ãŒã«ã®ã³ãŒãã»ã¯ã·ã§ã³ãšã¡ã¢ãªã»ã¯ã·ã§ã³ãå³å¯ã«æ€èšŒããŸãããèªèã§ããªãã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã¯å®å šã«ç¡èŠããããã«èšèšãããŠããŸãããã®æ©èœã«ãããããŒã«ãã§ãŒã³ãšéçºè ã¯ããããã°ã·ã³ãã«ããã¹ããŒãã³ã³ãã©ã¯ãã®ABIãŸã§ãä»»æã®ã¡ã¿ããŒã¿ãäºææ§ãæãªãããšãªãåã蟌ãããšãã§ããŸãããã ãããã®ãããã©ã«ãã§ç¡èŠããããšããåäœã¯ãã¡ã¿ããŒã¿ã®æ¹ããããµãã©ã€ãã§ãŒã³æ»æãããã³ãã®ä»ã®è匱æ§ã®æãéãããšã«ããªããŸãããããã®ã»ã¯ã·ã§ã³å ã®ããŒã¿ãã©ã®ããã«ä¿¡é Œã§ããŸããïŒæªæãæã£ãŠå€æŽãããŠããªãããšãã©ã®ããã«ä¿èšŒããŸããïŒ
ãã®å æ¬çãªã¬ã€ãã§ã¯ãWebAssemblyã«ã¹ã¿ã ã»ã¯ã·ã§ã³æ€èšŒã®éèŠãªå®è·µã«ã€ããŠè©³ãã説æããŸãããã®ããã»ã¹ãå®å šãªã·ã¹ãã ãæ§ç¯ããããã«äžå¯æ¬ ã§ããçç±ãæ¢ããåçŽãªããã·ã¥åããå ç¢ãªããžã¿ã«çœ²åãŸã§ãæŽåæ§ãã§ãã¯ã®ããã®ããŸããŸãªææ³ãåæããç¬èªã®ã¢ããªã±ãŒã·ã§ã³ã§ãããã®ãã§ãã¯ãå®è£ ããããã®å®çšçãªæŽå¯ãæäŸããŸãã
WebAssemblyãã€ããªåœ¢åŒã®çè§£ïŒç°¡åãªåŸ©ç¿
ã«ã¹ã¿ã ã»ã¯ã·ã§ã³æ€èšŒã®èª²é¡ãçè§£ããã«ã¯ããŸãWasmãã€ããªã¢ãžã¥ãŒã«ã®åºæ¬çãªæ§é ãçè§£ããããšãéèŠã§ãã`.wasm`ãã¡ã€ã«ã¯åãªãæ©æ¢°ã³ãŒãã®å¡ã§ã¯ãããŸãããæç¢ºãªãã»ã¯ã·ã§ã³ãã§æ§æãããé«åºŠã«æ§é åããããã€ããªåœ¢åŒã§ãããåã»ã¯ã·ã§ã³ã«ã¯ç¹å®ã®ç®çããããŸãã
äžè¬çãªWasmã¢ãžã¥ãŒã«ã¯ãããžãã¯ãã³ã㌠(\0asm) ãšããŒãžã§ã³ãã³ããŒã§å§ãŸãããã®åŸã«äžé£ã®ã»ã¯ã·ã§ã³ãç¶ããŸãããããã®ã»ã¯ã·ã§ã³ã¯ã次ã®ããã«åé¡ãããŸãã
- æ¢ç¥ã®ã»ã¯ã·ã§ã³ïŒ ãããã¯WebAssembly仿§ã«ãã£ãŠå®çŸ©ãããŠããããã¹ãŠã®æºæ ã©ã³ã¿ã€ã ã«ãã£ãŠçè§£ãããŸããã»ã¯ã·ã§ã³IDã¯ãŒã以å€ã§ããäŸïŒ
- åã»ã¯ã·ã§ã³ (ID 1)ïŒ ã¢ãžã¥ãŒã«ã§äœ¿çšããã颿°ã·ã°ããã£ãå®çŸ©ããŸãã
- 颿°ã»ã¯ã·ã§ã³ (ID 3)ïŒ å颿°ãåã»ã¯ã·ã§ã³ããã®ã·ã°ããã£ã«é¢é£ä»ããŸãã
- ã¡ã¢ãªã»ã¯ã·ã§ã³ (ID 5)ïŒ ã¢ãžã¥ãŒã«ã®ãªãã¢ã¡ã¢ãªãå®çŸ©ããŸãã
- ãšã¯ã¹ããŒãã»ã¯ã·ã§ã³ (ID 7)ïŒ é¢æ°ãã¡ã¢ãªããŸãã¯ã°ããŒãã«å€æ°ããã¹ãç°å¢ã§äœ¿çšã§ããããã«ããŸãã
- ã³ãŒãã»ã¯ã·ã§ã³ (ID 10)ïŒ å颿°ã®å®éã®å®è¡å¯èœãã€ãã³ãŒããå«ãŸããŠããŸãã
- ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ïŒ ããã¯ç§ãã¡ã®æ³šååéã§ããã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã¯ã»ã¯ã·ã§ã³ID 0ã§èå¥ãããŸããWasm仿§ã§ã¯ãã©ã³ã¿ã€ã ãšããŒã«ã¯çè§£ã§ããªãã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãé»ã£ãŠç¡èŠããå¿ èŠããããŸãã
ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã®æ§é
ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã®æ§é ã¯ãæå€§éã®æè»æ§ãå®çŸããããã«æå³çã«æ±çšçã«ãªã£ãŠããŸããæ¬¡ã®3ã€ã®éšåã§æ§æãããŠããŸãã
- ã»ã¯ã·ã§ã³IDïŒ åžžã«0ã
- ååïŒ ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã®ç®çãèå¥ããæååïŒäŸïŒãnameãããdwarf_infoãããcomponent-typeãïŒããã®ååã«ãããããŒã«ã¯é¢å¿ã®ããã»ã¯ã·ã§ã³ãèŠã€ããŠè§£éã§ããŸãã
- ãã€ããŒãïŒ ä»»æã®ãã€ãã·ãŒã±ã³ã¹ããã®ãã€ããŒãã®å 容ãšåœ¢åŒã¯ããããäœæããããŒã«ãŸãã¯ã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠå®å šã«ç°ãªããŸããWasmã©ã³ã¿ã€ã èªäœã¯ããã®ããŒã¿ã«å¶çŽã課ããŸããã
ãã®èšèšã¯äž¡åã®å£ã§ããããã«ããããšã³ã·ã¹ãã ã¯é©æ°ãèµ·ãããRustã®ãããã¯æ å ±ãGoã©ã³ã¿ã€ã ããŒã¿ããŸãã¯ã³ã³ããŒãã³ãã¢ãã«ã®å®çŸ©ãªã©ã®è±å¯ãªã¡ã¿ããŒã¿ãåã蟌ãããšãã§ããŸããããããæšæºã®Wasmã©ã³ã¿ã€ã ããã®ããŒã¿ãæ€èšŒã§ããªãçç±ã§ããããŸããããŒã¿ãæ¬æ¥ã©ãããã¹ãããç¥ããªãã®ã§ãã
ã»ãã¥ãªãã£äžã®ç²ç¹ïŒæ€èšŒãããŠããªãã¡ã¿ããŒã¿ããªã¹ã¯ãšãªãçç±
äžå¿çãªã»ãã¥ãªãã£ã®åé¡ã¯ãWasmã¢ãžã¥ãŒã«ãšãã®ã¡ã¿ããŒã¿ãæ¶è²»ããããŒã«ãŸãã¯ãã¹ãã¢ããªã±ãŒã·ã§ã³ãšã®éã®ä¿¡é Œé¢ä¿ããçããŸããWasmã©ã³ã¿ã€ã ã¯ã³ãŒããå®å šã«å®è¡ããŸãããã·ã¹ãã ã®ä»ã®éšåã¯ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã®ããŒã¿ãæé»çã«ä¿¡é Œããå¯èœæ§ããããŸãããã®ä¿¡é Œã¯ãããã€ãã®æ¹æ³ã§æªçšãããå¯èœæ§ããããŸãã
ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãéããæ»æãã¯ãã«
- ã¡ã¿ããŒã¿ã®æ¹ããïŒ æ»æè ã¯ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã倿ŽããŠãéçºè ãããŒã«ã誀解ãããå¯èœæ§ããããŸãããããã°æ å ±ïŒDWARFïŒã倿ŽããŠééã£ããœãŒã¹ã³ãŒãè¡ãæã瀺ããã»ãã¥ãªãã£ç£æ»äžã«æªæã®ããããžãã¯ãé èœããããšãæ³åããŠãã ããããŸãã¯ããããã¯ãã§ãŒã³ã®ã³ã³ããã¹ãã§ã¯ãã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã«ä¿åãããŠããã¹ããŒãã³ã³ãã©ã¯ãã®ABIïŒã¢ããªã±ãŒã·ã§ã³ãã€ããªã€ã³ã¿ãŒãã§ã€ã¹ïŒã倿Žãããšã忣åã¢ããªã±ãŒã·ã§ã³ïŒdAppïŒãééã£ã颿°ãåŒã³åºããçµæžçæå€±ã«ã€ãªããå¯èœæ§ããããŸãã
- ãµãŒãã¹æåŠïŒDoSïŒïŒ Wasmã©ã³ã¿ã€ã ã¯æªç¥ã®ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãç¡èŠããŸãããããŒã«ãã§ãŒã³ã¯ç¡èŠããŸãããã³ã³ãã€ã©ããªã³ã«ããããã¬ãããã³éçè§£æããŒã«ã¯ãç¹å®ã®ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãè§£æããããšããããããŸããæ»æè ã¯ããããã®ããŒã«ãã¯ã©ãã·ã¥ãããããã«ç¹å¥ã«èšèšããããäžæ£ãªåœ¢åŒã®ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ïŒããšãã°ãäžæ£ç¢ºãªé·ãã®ãã¬ãã£ãã¯ã¹ãŸãã¯ç¡å¹ãªå éšæ§é ãæã€ïŒãäœæããéçºããã³ãããã€ã¡ã³ããã€ãã©ã€ã³ãæ··ä¹±ãããå¯èœæ§ããããŸãã
- ãµãã©ã€ãã§ãŒã³æ»æïŒ Wasmã¢ãžã¥ãŒã«ãšããŠé åžãããŠããäžè¬çãªã©ã€ãã©ãªã«ã¯ã䟵害ããããã«ããµãŒããŒãŸãã¯äžéè æ»æã«ãã£ãŠãæªæã®ããã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãæ³šå ¥ãããŠããå¯èœæ§ããããŸãããã®ã»ã¯ã·ã§ã³ã«ã¯ãæªæã®ããæ§æããŒã¿ãå«ãŸããŠããå¯èœæ§ããããåŸã§ãã¹ãã¢ããªã±ãŒã·ã§ã³ãŸãã¯ãã«ãããŒã«ã«ãã£ãŠèªã¿åãããæªæã®ããäŸåé¢ä¿ãããŠã³ããŒãããããæ©å¯ããŒã¿ãæµåºããããã«æç€ºããŸãã
- 誀解ãæãåºææ å ±ïŒ ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã¯ããã«ãæ å ±ããœãŒã¹ã³ãŒãããã·ã¥ããŸãã¯ã©ã€ã»ã³ã¹ããŒã¿ãä¿åããããã«ãã䜿çšãããŸããæ»æè ã¯ãã®ããŒã¿ã倿ŽããŠãæªæã®ããã¢ãžã¥ãŒã«ã®åºæãé ããããä¿¡é Œã§ããéçºè ã«åž°å±ããããããã®ã©ã€ã»ã³ã¹ãå¶éçãªãã®ãã蚱容çãªãã®ã«å€æŽãããããå¯èœæ§ããããŸãã
ãããã®ãã¹ãŠã®ã·ããªãªã§ã¯ãWasmã¢ãžã¥ãŒã«èªäœã¯ãµã³ãããã¯ã¹å ã§å®å šã«å®è¡ãããå¯èœæ§ããããŸããè匱æ§ã¯ãä¿¡é Œã§ãããšæ³å®ãããã¡ã¿ããŒã¿ã«åºã¥ããŠæ±ºå®ãäžãWasmã¢ãžã¥ãŒã«ã®åšèŸºã®ãšã³ã·ã¹ãã ã«ãããŸãã
ã¡ã¿ããŒã¿æŽåæ§ãã§ãã¯ã®ææ³
ãããã®ãªã¹ã¯ã軜æžããã«ã¯ãæé»çãªä¿¡é Œã®ã¢ãã«ããæç€ºçãªæ€èšŒã®ã¢ãã«ã«ç§»è¡ããå¿ èŠããããŸããããã«ã¯ãéèŠãªã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã®æŽåæ§ãšä¿¡é Œæ§ãã䜿çšããåã«ãã§ãã¯ããæ€èšŒã¬ã€ã€ãŒã®å®è£ ãå«ãŸããŸããåçŽãªãã®ããæå·çã«å®å šãªãã®ãŸã§ãããã€ãã®ææ³ãèŠãŠã¿ãŸãããã
1. ããã·ã¥ãšãã§ãã¯ãµã
æãåçŽãªåœ¢åŒã®æŽåæ§ãã§ãã¯ã¯ãæå·åŠçããã·ã¥é¢æ°ïŒSHA-256ãªã©ïŒã䜿çšããããšã§ãã
- ä»çµã¿ïŒ ãã«ãããã»ã¹äžãã«ã¹ã¿ã ã»ã¯ã·ã§ã³ïŒããšãã°ã`my_app_metadata`ïŒãäœæãããåŸããã®SHA-256ããã·ã¥ãèšç®ããŸãããã®ããã·ã¥ã¯ãå¥ã®å°çšã®ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ïŒããšãã°ã`my_app_metadata.sha256`ïŒãŸãã¯Wasmã¢ãžã¥ãŒã«ã«ä»éããå€éšãããã§ã¹ããã¡ã€ã«ã«ä¿åãããŸãã
- æ€èšŒïŒ æ¶è²»åŽã®ã¢ããªã±ãŒã·ã§ã³ãŸãã¯ããŒã«ã¯ã`my_app_metadata`ã»ã¯ã·ã§ã³ãèªã¿åãããã®ããã·ã¥ãèšç®ããä¿åãããããã·ã¥ãšæ¯èŒããŸããäžèŽããå ŽåãããŒã¿ã¯ããã·ã¥ãèšç®ãããŠãã倿ŽãããŠããŸãããäžèŽããªãå Žåãã¢ãžã¥ãŒã«ã¯æ¹ããããããã®ãšããŠæåŠãããŸãã
ã¡ãªããïŒ
- å®è£ ãç°¡åã§ãèšç®ãé«éã§ãã
- å¶çºçãªç Žæãæå³çãªå€æŽã«å¯Ÿããåªããä¿è·ãæäŸããŸãã
ãã¡ãªããïŒ
- ä¿¡é Œæ§ããªãïŒ ããã·ã¥ã¯ããŒã¿ã倿ŽãããŠããªãããšã蚌æããŸããã誰ãäœæãããã¯èšŒæããŸãããæ»æè ã¯ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã倿Žããããã·ã¥ãåèšç®ããŠãããã·ã¥ã»ã¯ã·ã§ã³ãæŽæ°ã§ããŸããããã·ã¥èªäœãå®å šã§æ¹ãã鲿¢ãããå Žæã«ä¿åãããŠããå Žåã«ã®ã¿æ©èœããŸãã
- ããã·ã¥èªäœãä¿¡é Œããããã®ã»ã«ã³ããªãã£ãã«ãå¿ èŠã§ãã
2. ããžã¿ã«çœ²åïŒé察称æå·ïŒ
æŽåæ§ãšä¿¡é Œæ§ã®äž¡æ¹ãæäŸãããã¯ããã«åŒ·åãªä¿èšŒã®ããã«ãããžã¿ã«çœ²åããŽãŒã«ãã¹ã¿ã³ããŒãã§ãã
- ä»çµã¿ïŒ ãã®ææ³ã§ã¯ãå
¬ééµ/ç§å¯éµãã¢ã䜿çšããŸããWasmã¢ãžã¥ãŒã«ã®äœæè
ã¯ç§å¯éµãä¿æããŸãã
- ãŸããåã®æ¹æ³ãšåæ§ã«ãã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã®ãã€ããŒãã®æå·åŠçããã·ã¥ãèšç®ãããŸãã
- 次ã«ããã®ããã·ã¥ã¯äœæè ã®ç§å¯éµã䜿çšããŠæå·åïŒçœ²åïŒãããŸãã
- çµæã®çœ²åã¯ãå¥ã®ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ïŒããšãã°ã`my_app_metadata.sig`ïŒã«ä¿åãããŸãã察å¿ããå ¬ééµã¯ãæ€èšŒè ã«é åžããå¿ èŠããããŸããå ¬ééµã¯ããã¹ãã¢ããªã±ãŒã·ã§ã³ã«åã蟌ãŸããããä¿¡é Œã§ããã¬ãžã¹ããªãããã§ãããããããå¥ã®ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã«é 眮ããããããå¯èœæ§ããããŸãïŒãã ããããã«ã¯å ¬ééµèªäœãä¿¡é Œããããã®å¥ã®ã¡ã«ããºã ãå¿ èŠã§ãïŒã
- æ€èšŒïŒ Wasmã¢ãžã¥ãŒã«ã®ã³ã³ã·ã¥ãŒãã¯ãæ¬¡ã®æé ãå®è¡ããŸãã
- `my_app_metadata`ã»ã¯ã·ã§ã³ã®ãã€ããŒãã®ããã·ã¥ãèšç®ããŸãã
- `my_app_metadata.sig`ã»ã¯ã·ã§ã³ãã眲åãèªã¿åããŸãã
- äœæè ã®å ¬ééµã䜿çšããŠã眲åã埩å·åããŠå ã®ããã·ã¥ãæããã«ããŸãã
- 埩å·åãããããã·ã¥ãšãæåã®ã¹ãããã§èšç®ããããã·ã¥ãæ¯èŒããŸããäžèŽããå Žåã眲åã¯æå¹ã§ããããã¯ãããŒã¿ãæ¹ãããããŠããªãããšïŒæŽåæ§ïŒãããã³ç§å¯éµã®ä¿æè ã«ãã£ãŠçœ²åãããããšïŒä¿¡é Œæ§/åºæïŒã®2ã€ã蚌æããŸãã
ã¡ãªããïŒ
- æŽåæ§ãšä¿¡é Œæ§ã®äž¡æ¹ã®åŒ·åãªä¿èšŒãæäŸããŸãã
- å ¬ééµã¯ã»ãã¥ãªãã£ãæãªãããšãªãåºãé åžã§ããŸãã
- å®å šãªãœãããŠã§ã¢ãµãã©ã€ãã§ãŒã³ã®åºç€ã圢æããŸãã
ãã¡ãªããïŒ
- å®è£ ãšç®¡çãããè€éã§ãïŒéµã®çæãé åžãããã³å€±å¹ïŒã
- åçŽãªããã·ã¥åãšæ¯èŒããŠãæ€èšŒäžã®èšç®ãªãŒããŒãããããããã«å€§ãããªããŸãã
3. ã¹ããŒãããŒã¹ã®æ€èšŒ
æŽåæ§ãšä¿¡é Œæ§ã®ãã§ãã¯ã«ãããããŒã¿ã倿ŽãããŠããããä¿¡é Œã§ãããœãŒã¹ããã®ãã®ã§ããããšãä¿èšŒãããŸãããããŒã¿ãæŽåœ¢åŒã§ããããšã¯ä¿èšŒãããŸãããæ§é çã«ç¡å¹ãªã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã¯ãããŒãµãŒãã¯ã©ãã·ã¥ãããå¯èœæ§ããããŸããã¹ããŒãããŒã¹ã®æ€èšŒã¯ãããã«å¯ŸåŠããŸãã
- ä»çµã¿ïŒ ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã®ãã€ããŒãã®ãã€ããªåœ¢åŒã«å¯ŸããŠå³å¯ãªã¹ããŒããå®çŸ©ããŸãããã®ã¹ããŒãã¯ãProtocol BuffersãFlatBuffersããŸãã¯ã«ã¹ã¿ã 仿§ãªã©ã®åœ¢åŒã䜿çšããŠå®çŸ©ã§ããŸããã¹ããŒãã¯ãããŒã¿åãé·ããããã³æ§é ã®äºæãããã·ãŒã±ã³ã¹ãæç€ºããŸãã
- æ€èšŒïŒ ããªããŒã¿ãŒã¯ãå®çŸ©æžã¿ã®ã¹ããŒãã«åŸã£ãŠã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã®ãã€ããŒãããã³ãŒãããããšããããŒãµãŒã§ãããšã©ãŒãªãã§è§£æãæåããå ŽåïŒããšãã°ããããã¡ãªãŒããŒãããŒããªããåã®äžäžèŽããªããäºæããããã¹ãŠã®ãã£ãŒã«ããååšããå ŽåïŒãã»ã¯ã·ã§ã³ã¯æ§é çã«æå¹ãšèŠãªãããŸããè§£æãéäžã§å€±æããå Žåãã»ã¯ã·ã§ã³ã¯æåŠãããŸãã
ã¡ãªããïŒ
- ããŒãµãŒãäžæ£ãªåœ¢åŒã®ããŒã¿ããä¿è·ããDoSæ»æã®ã¯ã©ã¹ãé²ããŸãã
- ã¡ã¿ããŒã¿ã®æŽåæ§ãšæ£ç¢ºæ§ã匷å¶ããŸãã
- ã«ã¹ã¿ã ããŒã¿åœ¢åŒã®ããã¥ã¡ã³ãã®åœ¢åŒãšããŠæ©èœããŸãã
ãã¡ãªããïŒ
- æ§é çã«æå¹ã§ã¯ãããæå³çã«æªæã®ãããã€ããŒããäœæããçç·Žããæ»æè ããä¿è·ããŸããã
- ã¹ããŒããšããªããŒã¿ãŒã³ãŒãã®ã¡ã³ããã³ã¹ãå¿ èŠã§ãã
éå±€åãããã¢ãããŒãïŒãã¹ãŠã®äžçã®æé«ã®éšå
ãããã®ææ³ã¯çžäºã«æä»çã§ã¯ãããŸãããå®éãéå±€åãããã»ãã¥ãªãã£æŠç¥ã§çµã¿åããããšæã匷åã«ãªããŸãã
æšå¥šãããæ€èšŒãã€ãã©ã€ã³ïŒ
- æ€çŽ¢ãšåé¢ïŒ ãŸããWasmã¢ãžã¥ãŒã«ãè§£æããŠãã¿ãŒã²ããã®ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ïŒããšãã°ã`my_app_metadata`ïŒãšãã®å¯Ÿå¿ãã眲åã»ã¯ã·ã§ã³ïŒ`my_app_metadata.sig`ïŒãèŠã€ããŸãã
- ä¿¡é Œæ§ãšæŽåæ§ã®æ€èšŒïŒ ããžã¿ã«çœ²åã䜿çšããŠã`my_app_metadata`ã»ã¯ã·ã§ã³ãä¿¡é Œã§ããæ¹ãããããŠããªãããšã確èªããŸãããã®ãã§ãã¯ã倱æããå Žåã¯ãã¢ãžã¥ãŒã«ãçŽã¡ã«æåŠããŸãã
- æ§é ã®æ€èšŒïŒ 眲åãæå¹ãªå Žåã¯ãã¹ããŒãããŒã¹ã®ããªããŒã¿ãŒã䜿çšããŠ`my_app_metadata`ãã€ããŒãã®è§£æã«é²ã¿ãŸãã圢åŒãæ£ãããªãå Žåã¯ãã¢ãžã¥ãŒã«ãæåŠããŸãã
- ããŒã¿ã®äœ¿çšïŒ äž¡æ¹ã®ãã§ãã¯ã«åæ ŒããåŸã§ã®ã¿ãã¡ã¿ããŒã¿ãå®å šã«ä¿¡é ŒããŠäœ¿çšã§ããŸãã
ãã®éå±€åãããã¢ãããŒãã«ãããããŒã¿æ¹ããã ãã§ãªããè§£æããŒã¹ã®æ»æãããä¿è·ãããå ç¢ãªå€å±€é²åŸ¡ã®ã»ãã¥ãªãã£äœå¶ãæäŸãããŸãã
å®éã®å®è£ ãšããŒã«
ãã®æ€èšŒãå®è£ ããã«ã¯ãWasmãã€ããªãæäœããã³æ€æ»ã§ããããŒã«ãå¿ èŠã§ãããšã³ã·ã¹ãã ã«ã¯ãããã€ãã®åªãããªãã·ã§ã³ããããŸãã
ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãæäœããããã®ããŒã«
- wasm-toolsïŒ Wasmãã€ããªãè§£æãå°å·ãããã³æäœããããã®ã³ãã³ãã©ã€ã³ããŒã«ãšRustã¯ã¬ãŒãã®ã¹ã€ãŒãããã«ãã¹ã¯ãªããã®äžéšãšããŠãã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã远å ãåé€ããŸãã¯æ€æ»ããããã«äœ¿çšã§ããŸããããšãã°ã`wasm-tools strip`ã³ãã³ãã䜿çšããŠã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãåé€ã§ããŸãããã«ã¹ã¿ã ããã°ã©ã ã¯`wasm-tools`ã¯ã¬ãŒãã䜿çšããŠçœ²åã远å ããããã«æ§ç¯ã§ããŸãã
- BinaryenïŒ WebAssemblyçšã®ã³ã³ãã€ã©ããã³ããŒã«ãã§ãŒã³ã€ã³ãã©ã¹ãã©ã¯ãã£ã©ã€ãã©ãªããã®`wasm-opt`ããŒã«ã¯ãããŸããŸãªå€æã«äœ¿çšã§ãããã®C++ APIã¯ãã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãå«ãã¢ãžã¥ãŒã«ã®æ§é ã现ããå¶åŸ¡ã§ããŸãã
- èšèªåºæã®ããŒã«ãã§ãŒã³ïŒ `wasm-bindgen`ïŒRustçšïŒãä»ã®èšèªã®ã³ã³ãã€ã©ãªã©ã®ããŒã«ã¯ãã³ã³ãã€ã«ããã»ã¹äžã«ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãæ¿å ¥ããããã®ã¡ã«ããºã ãŸãã¯ãã©ã°ã€ã³ãæäŸããããšããããããŸãã
ããªããŒã¿ãŒã®ç䌌ã³ãŒã
ãã¹ãã¢ããªã±ãŒã·ã§ã³ã®ããªããŒã¿ãŒé¢æ°ãã©ã®ããã«èŠãããã®æŠå¿µçãªé«ã¬ãã«ã®äŸã次ã«ç€ºããŸãã
function validateWasmModule(wasmBytes, trustedPublicKey) { // ã¹ããã1ïŒã¢ãžã¥ãŒã«ãè§£æããŠé¢é£ã»ã¯ã·ã§ã³ãèŠã€ãã const module = parseWasmSections(wasmBytes); const metadataSection = module.findCustomSection("my_app_metadata"); const signatureSection = module.findCustomSection("my_app_metadata.sig"); if (!metadataSection || !signatureSection) { throw new Error("å¿ èŠãªã¡ã¿ããŒã¿ãŸãã¯çœ²åã»ã¯ã·ã§ã³ããããŸããã"); } // ã¹ããã2ïŒããžã¿ã«çœ²åãæ€èšŒãã const metadataPayload = metadataSection.payload; const signature = signatureSection.payload; const isSignatureValid = crypto.verify(metadataPayload, signature, trustedPublicKey); if (!isSignatureValid) { throw new Error("ã¡ã¿ããŒã¿çœ²åãç¡å¹ã§ããã¢ãžã¥ãŒã«ãæ¹ãããããŠããå¯èœæ§ããããŸãã"); } // ã¹ããã3ïŒã¹ããŒãããŒã¹ã®æ€èšŒãå®è¡ãã try { const parsedMetadata = MyAppSchema.decode(metadataPayload); // ããŒã¿ã¯æå¹ã§ãããä¿¡é Œã§ããŸã return { success: true, metadata: parsedMetadata }; } catch (error) { throw new Error("ã¡ã¿ããŒã¿ã®æ§é ãç¡å¹ã§ãïŒ" + error.message); } }
å®éã®ãŠãŒã¹ã±ãŒã¹
ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã®æ€èšŒã®å¿ èŠæ§ã¯çè«çãªãã®ã§ã¯ãããŸãããå€ãã®ææ°ã®WasmãŠãŒã¹ã±ãŒã¹ã«ãããå®éçãªèŠä»¶ã§ãã
- ãããã¯ãã§ãŒã³äžã®å®å šãªã¹ããŒãã³ã³ãã©ã¯ãïŒ ã¹ããŒãã³ã³ãã©ã¯ãã®ABIã¯ãã®ãããªãã¯é¢æ°ãèšè¿°ããŸãããã®ABIãã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã«ä¿åãããŠããå Žåã¯ã眲åããå¿ èŠããããŸããããã«ãããæªæã®ããã¢ã¯ã¿ãŒãäžæ£ãªABIãæç€ºããŠããŠãŒã¶ãŒã®ãŠã©ã¬ãããdAppã誀ã£ãŠã³ã³ãã©ã¯ããšå¯Ÿè©±ãããã®ãé²ããŸãã
- æ€èšŒå¯èœãªãœãããŠã§ã¢éšå衚ïŒSBOMïŒïŒ ãµãã©ã€ãã§ãŒã³ã®ã»ãã¥ãªãã£ã匷åããããã«ãWasmã¢ãžã¥ãŒã«ã¯ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã«ç¬èªã®SBOMãåã蟌ãããšãã§ããŸãããã®ã»ã¯ã·ã§ã³ã«çœ²åãããšãäŸåé¢ä¿ã®ãªã¹ããä¿¡é Œã§ããè匱ãŸãã¯æªæã®ããã³ã³ããŒãã³ããé ãããã«å€æŽãããŠããªãããšãä¿èšŒãããŸããã¢ãžã¥ãŒã«ã®ã³ã³ã·ã¥ãŒããŒã¯ã䜿çšåã«ãã®å 容ãèªåçã«æ€èšŒã§ããŸãã
- å®å šãªãã©ã°ã€ã³ã·ã¹ãã ïŒ ãã¹ãã¢ããªã±ãŒã·ã§ã³ïŒãããã·ãããŒã¿ããŒã¹ããŸãã¯ã¯ãªãšã€ãã£ãããŒã«ãªã©ïŒã¯ãWasmããã©ã°ã€ã³ã¢ãŒããã¯ãã£ã«äœ¿çšã§ããŸãããµãŒãããŒãã£è£œãã©ã°ã€ã³ãããŒãããåã«ããã¹ãã¯çœ²åä»ãã®`permissions`ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã確èªã§ããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ããã©ã°ã€ã³ã«å¿ èŠãªæ©èœïŒãã¡ã€ã«ã·ã¹ãã ã¢ã¯ã»ã¹ããããã¯ãŒã¯ã¢ã¯ã»ã¹ãªã©ïŒã宣èšã§ããŸãã眲åã¯ãçºè¡åŸã«æ»æè ãèš±å¯ããšã¹ã«ã¬ãŒãããŠããªãããšãä¿èšŒããŸãã
- ã³ã³ãã³ãã¢ãã¬ã¹å¯èœãªé åžïŒ ã¡ã¿ããŒã¿ãå«ãWasmã¢ãžã¥ãŒã«ã®ãã¹ãŠã®ã»ã¯ã·ã§ã³ãããã·ã¥åããããšã«ããããã®æ£ç¢ºãªãã«ãã®äžæã®èå¥åãäœæã§ããŸããããã¯ãæŽåæ§ãã³ã¢ååã§ããIPFSã®ãããªã³ã³ãã³ãã¢ãã¬ã¹å¯èœãªã¹ãã¬ãŒãžã·ã¹ãã ã§äœ¿çšãããŸããã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãæ€èšŒããããšã¯ããã®æ±ºå®è«çã¢ã€ãã³ãã£ãã£ãä¿èšŒããããã®éèŠãªéšåã§ãã
å°æ¥ïŒæšæºåãšã³ã³ããŒãã³ãã¢ãã«
WebAssemblyã³ãã¥ããã£ã¯ãã¢ãžã¥ãŒã«ã®æŽåæ§ã®éèŠæ§ãèªèããŠããŸããWasmã³ãã¥ããã£ã°ã«ãŒãå ã§ã¯ãã¢ãžã¥ãŒã«ã®çœ²åããã®ä»ã®ã»ãã¥ãªãã£ããªããã£ãã®æšæºåã«ã€ããŠç¶ç¶çãªè°è«ãè¡ãããŠããŸããæšæºåãããã¢ãããŒãã«ãããã©ã³ã¿ã€ã ãšããŒã«ã¯æ€èšŒããã€ãã£ãã«å®è¡ã§ããããã«ãªããéçºè ã«ãšã£ãŠããã»ã¹ãç°¡çŽ åãããŸãã
ããã«ãæ°èã®WebAssemblyã³ã³ããŒãã³ãã¢ãã«ã¯ãWasmã¢ãžã¥ãŒã«ãäºãã«ãããã³ãã¹ããšã©ã®ããã«å¯Ÿè©±ããããæšæºåããããšãç®æããŠããŸãã`component-type`ãšããååã®ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã§é«ã¬ãã«ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®çŸ©ããŸãããã®ã»ã¯ã·ã§ã³ã®æŽåæ§ã¯ãã³ã³ããŒãã³ããšã³ã·ã¹ãã å šäœã®ã»ãã¥ãªãã£ã«ãšã£ãŠæãéèŠã§ãããããã§èª¬æããæ€èšŒææ³ã¯ããã«éèŠã«ãªããŸãã
çµè«ïŒä¿¡é Œããæ€èšŒãž
WebAssemblyã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã¯äžå¯æ¬ ãªæè»æ§ãæäŸãããšã³ã·ã¹ãã ãè±å¯ãªãã¡ã€ã³åºæã®ã¡ã¿ããŒã¿ãã¢ãžã¥ãŒã«ã«çŽæ¥åã蟌ãããšãå¯èœã«ããŸãããã ãããã®æè»æ§ã«ã¯æ€èšŒã®è²¬ä»»ã䌎ããŸããWasmã©ã³ã¿ã€ã ã®ããã©ã«ãã®åäœïŒçè§£ã§ããªããã®ãç¡èŠããããšïŒã¯ãæªçšãããå¯èœæ§ã®ããä¿¡é Œã®ã®ã£ãããçã¿åºããŸãã
WebAssemblyã䜿çšããŠæ§ç¯ããéçºè ãŸãã¯ã¢ãŒããã¯ããšããŠãã¡ã¿ããŒã¿ãæé»çã«ä¿¡é Œããã®ã§ã¯ãªããæç€ºçã«æ€èšŒããããã«èãæ¹ãå€ããå¿ èŠããããŸããæ§é çãªæ£ç¢ºãã®ããã®ã¹ããŒããã§ãã¯ãšãæŽåæ§ãšä¿¡é Œæ§ã®ããã®ããžã¿ã«çœ²åãçµã¿åãããéå±€åãããæ€èšŒæŠç¥ãå®è£ ããããšã«ããããã®ã»ãã¥ãªãã£ã®ã£ãããåããããšãã§ããŸãã
å®å šã§å ç¢ã§ä¿¡é Œã§ããWasmãšã³ã·ã¹ãã ãæ§ç¯ããã«ã¯ããã¹ãŠã®ã¬ã€ã€ãŒã§åªåãå¿ èŠã§ããã¡ã¿ããŒã¿ãã»ãã¥ãªãã£ãã§ãŒã³ã®åŒ±ããªã³ã¯ã«ããªãã§ãã ãããã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãæ€èšŒããã¢ããªã±ãŒã·ã§ã³ãä¿è·ããèªä¿¡ãæã£ãŠæ§ç¯ããŠãã ããã